import com.beans.User;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;

import java.security.cert.X509Certificate;

public class APP {
    public static void main1(String[] args) {
        System.out.println("hello spring");
    }



    // spring中取对象
    public static void main2(String[] args) {
        // 获取spring对象
        // 1.得到spring上下文对象
        //    ApplicationContext是我们在spring-config.xml引入的依赖
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

        // 2.通过上下文提供的方法 获取我们自己所需要的bean对象
        // 直接通过getBean方法
        User user = (User) context.getBean("user");

        // 3.拿到bean对象后 就可以调用其方法
        user.sayHi("spring");







        // 我们还可以使用BeanFactory来获取上下文对象
        BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
        // 也是通过getBean获取对象
        User user1 = (User) beanFactory.getBean("user");
        // 使用
        user.sayHi("java");
    }


    // beanFactory是懒加载 用到那个bean对象 就加载哪个对象
    public static void main3(String[] args) {
        //ApplicationContext获取上下文对象 会将配置文件的bean对象存入的Spring中
//        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
// 打印
//构造了 User
//构造了 Article



        BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
//  没有任何打印
        // 但是如果使用getBean方法之后 就有打印
        // 通过第二步 (对应)的bean对象才会被加载到spring中
        User user = (User) beanFactory.getBean("user");
//        打印
//        构造了 User
    }


//    getBean()第一种写法
//User user = (User) context.getBean("user");
//    getBean()第二种写法
//User user = (User) context.getBean(User.class);
//    getBean()第三种写法(一二结合)
//User user = (User) context.getBean("user",User.class);

}
